AdamWeightDecay
对权重张量执行 Adam Weight Decay 优化更新。
\[\begin{split}\begin{aligned} m_t &= \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g_t \\ v_t &= \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot g_t^2 \\ \hat{m}_t &= \frac{m_t}{\sqrt{v_t} + \epsilon} \\ var_t &= var_{t-1} - lr \cdot (\hat{m}_t + decay \cdot var_{t-1}) \end{aligned}\end{split}\]
- 输入:
var - 待更新权重张量首地址。
m - 一阶动量张量首地址。
v - 二阶动量张量首地址。
gradient - 梯度张量首地址。
lr - 学习率。
beta1 - 一阶动量衰减系数。
beta2 - 二阶动量衰减系数。
epsilon - 数值稳定项。
decay - 权重衰减系数。
start - 参与计算的起始索引(闭区间)。
end - 参与计算的结束索引(开区间)。
core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。
- 输出:
var - 原地写回更新后的权重张量。
m - 原地写回更新后的一阶动量张量。
v - 原地写回更新后的二阶动量张量。
- 支持平台:
FT78NEMT7004备注
FT78NE 支持 fp32 数据类型。
MT7004 支持 fp16、fp32 数据类型。
共享存储版本:
-
void hp_adamweightdecay_s(half *var, half *m, half *v, const half *gradient, float lr, float beta1, float beta2, float epsilon, float decay, int start, int end, int core_mask)
-
void fp_adamweightdecay_s(float *var, float *m, float *v, const float *gradient, float lr, float beta1, float beta2, float epsilon, float decay, int start, int end, int core_mask)
C调用示例:
1// FT78NE 多核示例 2#include <stdio.h> 3 4int main(void) { 5 float *var = (float *)0xA0000000; // DDR 存储 6 float *m = (float *)0xB0000000; 7 float *v = (float *)0xC0000000; 8 float *gradient = (float *)0xD0000000; 9 int start = 0; 10 int end = 4096; 11 int core_mask = 0xff; 12 float lr = 1e-3f; 13 float beta1 = 0.9f; 14 float beta2 = 0.999f; 15 float epsilon = 1e-8f; 16 float decay = 1e-2f; 17 fp_adamweightdecay_s(var, m, v, gradient, lr, 18 beta1, beta2, epsilon, decay, 19 start, end, core_mask); 20 return 0; 21}
私有存储版本:
-
void hp_adamweightdecay_p(half *var, half *m, half *v, const half *gradient, float lr, float beta1, float beta2, float epsilon, float decay, int length)
-
void fp_adamweightdecay_p(float *var, float *m, float *v, const float *gradient, float lr, float beta1, float beta2, float epsilon, float decay, int length)
C调用示例:
1// MT7004 单核示例 2#include <stdio.h> 3 4int main(void) { 5 half *var = (half *)0x10000000; // L2 存储 6 half *m = (half *)0x10002000; 7 half *v = (half *)0x10004000; 8 half *gradient = (half *)0x10006000; 9 int length = 2048; 10 float lr = 5e-4f; 11 float beta1 = 0.9f; 12 float beta2 = 0.999f; 13 float epsilon = 1e-6f; 14 float decay = 5e-3f; 15 hp_adamweightdecay_p(var, m, v, gradient, lr, 16 beta1, beta2, epsilon, decay, 17 length); 18 return 0; 19}